面向对象编程的本质就是:以类的方式组织代码,以对象的形式组织(封装)数据
对象是具体的事物,类是抽象的,是对对象的抽象,在代码运行中是先有类后有对象,类是对象的模板
三大特征:
java是值传递 可以通过下面的代码来进行测试:
public static void main(String[] args) { int a=1; System.out.println(a); max(a); System.out.println(a); } public static void max(int a){ a=10; }
运行结果如下所示 :
可以看到虽然使用了max方法 但是a的值并没有发生改变 还是为1 这就是值传递
引用传递 本质还是值传递
public class Demo03 { public static void main(String[] args) { Person p = new Person(); System.out.println(p.name); //null Demo03.change(p); System.out.println(p.name); } public static void change(Person p){ // person是一个对象 指向的是一个具体的人 p 可以改变对象 p.name="a"; } } class Person{ String name; }
运行结果如下所示:
例:
//学生类 public class Student { //属性:字段 String name; int age; //方法 public void study(){ System.out.println(this.name+"在学习"); } }
public static void main(String[] args) { //类:抽象的 需要实例化 //类实例化后会返回一个自己的对象 //s 对象就是一个Student类的具体实例 Student s = new Student(); System.out.println(s.name); System.out.println(s.age); //在创建对象的时候 不仅分配了空间并且给了初始值 s.name="张华"; s.age=100; System.out.println(s.name); System.out.println(s.age); }
类中的构造器也称为构造方法,是在进行创建对象的时候不需要调用的,并且构造器有以下两个特点:
必须和类的名字相同
必须没有返回类型,也不能写void
一个类即使什么也不写,它也会有一个方法,这就是构造器,默认为无参构造器
使用new关键字,必须要有构造器。它的本质实在调用构造器。
一旦定义了有参构造,无参构造就必须显示
//无参构造 public Student() { } //有参构造:一旦有了有参构造,无参构造就必须显示定义 public Student(String name) { this.name = name; }
程序设计要追求”高内聚,低耦合“。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉,低耦合:仅暴露少量的方法给外部使用。
封装:通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
在类中我们一般会将属性私有化(使用private关键词),我们可以通过提供public的get和set方法来操作这些私有属性
例子:
private String name; private int age; private int no; public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} public int getNo() {return no;} public void setNo(int no) {this.no = no;}
注意点:
和this的区别
即同一个方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件:
对象能执行的方法主要看左边的引用类型
如果子类重写了父类的方法,那么如果使用多态创建新对象,那么使用这个方法是调用子类的方法来使用
public class UserServeseImp extends User implements userServese ,TimeServese { @Override public void timer() {} @Override public void add(String name) {} @Override public void delete(String name) {} @Override public void update(String name) {} @Override public void query(String name) {}}
一个类可以实现多个接口,但是必须重写多个接口的所有方法
内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对于A类来说就称为内部类,而A类相对B类来说就是一个外部类
private int id; public void out(){ System.out.println("这是外部类的方法"); } public class Inner{ public void in(){ System.out.println("这是内部类"); } }
Outer outer = new Outer(); Outer.Inner inner = outer.new Inner();//成员内部类 inner.in(); outer.out();
测试结果如下:
public class Outer { public void method(){ //局部内部类 class Inner{ public void inner(){ } } } }
没有名字也可以初始化类,不用将实例保存在变量中
public class Test { public static void main(String[] args) { new no().abc(); UserService userService = new UserService() { @Override public void inter() { System.out.println("接口的方法"); } }; } } class no{ public void abc(){ System.out.println("匿名内部类"); } } interface UserService{ void inter(); }
测试结果如下: