面向对象是当前软件开发的主流设计规范,是一种编程语言模式。
面向对象主要包括面型对象分析,面型对象设计,面型对象编程。
面型对象分析就是以面向对象“类”的概念去认识问题,分析问题。
1.下面举一个很简单的例子,介绍如何建立一个类,以及如何建立类的对象,构造方法,自己定义的方法。
import java.util.*;
public class Rectangle {
//创建类的属性
private double length;
private double width;
//创建属性的方法
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
//构造方法
//这个构造方法是有参数的,默认的构造方法是无参数的。
public Rectangle(double width,double length){
this.width=width;
this.length=length;
}
//无参数的构造方法
public Rectangle(){}
//我们可以自己定义方法
public void outputarea(){
System.out.println("长方形的面积是:"+area());
}
public double area(){
return width*length;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("input ractangle length:");
double length = scanner.nextDouble();
System.out.println("input ractangle width:");
double width = scanner.nextDouble();
Rectangle rectangle = new Rectangle(width,length);
rectangle.outputarea();
}
}
input ractangle length:
6
input ractangle width:
5
长方形的面积是:30.0
2.参数的传递以及重载
2.1值传递
public class CallByValue {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 5;
System.out.println("调用change方法前:"+num);
CallByValue callByValue = new CallByValue();
callByValue.change(num);
System.out.println("调用change方法后:"+num);
}
public void change(int num){
num+=5;
System.out.println("change方法中num的值:"+num);
}
}
.
2.2引用传递
public class CallByRef {
int a,b;
public CallByRef(int i,int j) {
// TODO Auto-generated constructor stub
this.a=i;
this.b=j;
}
public void change(CallByRef callByRef){
callByRef.a=50;
callByRef.b=66;
System.out.println("在change中callbyRef.a:"+callByRef.a+",callbyRef.b:"+callByRef.b);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CallByRef callbyRef = new CallByRef(10, 20);
System.out.println("调用change方法前callbyRef.a:"+callbyRef.a+",callbyRef.b:"+callbyRef.b);
callbyRef.change(callbyRef);
System.out.println("调用change方法后callbyRef.a:"+callbyRef.a+",callbyRef.b:"+callbyRef.b);
}
}
2.3重载:
方法重载是同一个类中多态性的一种表现形式,方法重载经常用来完成相似的操作。
public class MyMath {
public int add(int a,int b){
return a+b;
}
public float add(float a,float b){
return a+b;
}
public double add(double a,double b){
return a+b;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyMath myMath = new MyMath();
System.out.println("3+5="+myMath.add(3, 5));
System.out.println("2.6+3.3="+myMath.add(2.6F, 3.3F));
System.out.println("3.3+5.5="+myMath.add(3.3, 5.5));
}
}
3.类之间的组织。
在项目开发中,为了避免类名的重复,允许使用包来对类进行组织。
定义包:package 包名
导入包:import 包名.*;导入包中所有的类
import 包名.类名 导入指定包中指定的类
4.访问修饰符
public,private,protected,缺省的(friendly)。
使用public,类成员可以被同一包中或者不同的包中所有的类访问。
使用private,类成员只能被此类中其他成员访问。
使用protected,类成员可以被同一包中所有的类,所有的子类访问。
使用friendly,类成员可以被同一包中所有的类访问。
5.静态变量和方法
在java中可以将一些成员限制成“类相关”,我们前面的类中定义的变量都是实例相关的,只有实例化对象后才可以访问。
而类相关则通过类名就能够访问。方法是:在类的成员(属性或者方法)前面加上“static”关键字
例子:
public class InstanceCounter {
public static int count =0;
public InstanceCounter(){
count++;
}
public static void outputCount(){
System.out.println("创建实例的个数为:"+count);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
InstanceCounter counter = new InstanceCounter();
}
InstanceCounter.outputCount();
}
}
创建实例的个数为:10
5.类之间的关系
在面向对象的系统中,通常不会存在孤立的类,类之间,对象之间总是存在各种各样的关系,正是通过这些关系个各类,对象共同构成可运行的程序,从而完成任务。
类与类之间大概存在六种关系:
继承,实现,依赖,关联,聚合,组合。
其中继承和实现是一种纵向的关系,其余四种是横向的关系。其中关联,聚合,组成在代码上是无法区分的。更多的是在语义上。
我们最常用的还是继承,实现。这里主要以这两个实例为主。
5.1继承
//Extends test
public class Person {
public int age;
public String sex;
public String name;
public Person(){
System.out.println("无参数的构造方法");
}
public Person(int age,String sex,String name){
this.age=age;
this.name=name;
this.sex=sex;
}
public void output(){
System.out.println("name is :"+name);
System.out.println("sex is:"+sex);
System.out.println("age is:"+age);
}
}
public class Teacher extends Person{
public double salary;
public Teacher(){};//无参数的构造
public Teacher(int age,String sex,String name,double salary){
super(age,sex,name);
this.salary=salary;
}
public void output(){
super.output();
System.out.println("salary is"+salary);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Teacher teacher = new Teacher(22,"男","Tom",10000.0);
teacher.output();
}
}
name is :Tom
sex is:男
age is:22
salary is10000.0
首先我们创建了Person类,然后我们让Teacher类来继承我们的person类,那么teacher类也会有person类中的属性和方法,当然前提是我们的属性不能是private。那么如果teacher来还想要访问这个私有属性怎么办么,那么就要用public的get,set方法来获取了。这相当于只给你提供了一个实用的接口。
1.super关键字代表父类对象,主要有两个用途。
(1)调用父类的构造方法。
构造方法是不能够继承的,但可以通过关键字super,在子类的构造方法中可以调用父类的构造方法。以便完成父类的初始化。
(2)访问父类的书属性和方法。
2.final关键字
表示不可改变的,最终的,主要有三个用途:
(1)修饰变量:表示此变量不可修改。
(2)修饰方法:表示此方法不可重写。
(3)修饰类:表示此类不可被继承。
3.equals方法
使用“==”可以比较两个基本变量是否相等。但比较两个引用类型的变量是否相等有两种方法。
3.1:使用“==”,比较的是两个变量引用的是否是同一个变量。
3.2使用equals方法比较的是两个变量引用的对象的内容是否相等。
4.toString方法
直接举个小例子:
//Extends test
public class Person {
public int age;
public String sex;
public String name;
public Person(){
System.out.println("无参数的构造方法");
}
public Person(int age,String sex,String name){
this.age=age;
this.name=name;
this.sex=sex;
}
public void output(){
System.out.println("name is :"+name);
System.out.println("sex is:"+sex);
System.out.println("age is:"+age);
}
public static void main(String[] args) {
Person person = new Person(22,"男","Tom");
System.out.println(person);
}
}
Person@1db9742
//Extends test
public class Person {
public int age;
public String sex;
public String name;
public Person(){
System.out.println("无参数的构造方法");
}
public Person(int age,String sex,String name){
this.age=age;
this.name=name;
this.sex=sex;
}
public String toString(){
return getClass().getName()+"[name="+name+",age="+age+",sex="+sex+"]";
}
public void output(){
System.out.println("name is :"+name);
System.out.println("sex is:"+sex);
System.out.println("age is:"+age);
}
public static void main(String[] args) {
Person person = new Person(22,"男","Tom");
System.out.println(person);
}
}
Person[name=Tom,age=22,sex=男]