Java面向对象的三大特征及学习心得
来源:互联网 发布:阿里云宽带选择 编辑:程序博客网 时间:2024/06/07 06:01
目录
- 封装
- 继承
- 多态
- 相关补充
- 学习问题
- 备注代码
Java面向对象的三大特征:封装、继承、多态。
封装
封装是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,利用private实现。封装的实现: 1、私有化属性(private) 2、公开的方法(set/get) 3、加入限制条件(判断条件的合理性,例如age)
public class Student extends Person{ private int age; //private隐藏类内部,只能在本类中使用 public int setAge;//公开的方法 public void set(int age){ if(age>50){ System.out.println("lao");//判断合法性 this.age=20; } } public int get(){ if(age>10){ return 19; } return 0; } }
public class Person { public static void main(String[] args) { Student zhangsan=new Student(); System.out.println(zhangsan.get()); }}
继承
继承:子类继承父类的方法和属性 (利用extends)。
访问修饰符4种:
public :任何情况都可以访问
protected:子类
default:子类同包
private:只能在本类访问
对象的初始化顺序:
1、首先是父类的属性
2、父类的构造器
3、子类的属性
4、子类的构造器
5、系统默认调用无参数的副类构造器
public int age=10; public Student(String name,String sex){ super("张三","nan");//super子类必须在子类构造器第一行 //构造器中没有super时,默认为super(),此时super无参数传递; System.out.println("子类构造器"); System.out.println("子类属性age"+age); }
public Person() { } public Person(String name1, String sex1) { name = name1; sex = sex1; System.out.println("父类的构造器"); System.out.println("父类的属性age" + age); System.out.println(name); System.out.println(sex); }
多态
多态 :父类的引用指向子类的对象,调用同样的方法产生的结果不同。
方法的覆盖/重写:子类中覆写父类中的方法
特点:
1、方法名称相同
2、返回值类型相同
3、参数列表相同
4、访问修饰符不能比父类更严格
5、私有方法因为不能继承不能重写
复写的快捷键:
1、方法名+alt+回车
2、工具栏:source+override…(Override是注解)
覆写:
public class Dog extends Animal{ public void voice(){ System.out.println("汪汪汪"); }}
public class Animal {public void voice(){ System.out.println("动物叫"); }}
多态
Animal animal=new Animal(); Animal animal2=new Dog(); Animal animal3=new Cat(); animal.voice(); animal2.voice(); animal3.voice();
方法的重载:方法名相同 参数列表不同 无关访问修饰符和返回值类型
public void voice(String sex){ System.out.println("看见美女摇尾巴"); } public void voice (int age1){ int age=age1; if(age<=30) System.out.println("哇塞,小鲜肉"); else System.out.println("哦,老鲜肉"); }
dog.voice(); dog.voice("aa"); dog.voice(38);
相关补充
1、类:包含属性、方法、构造器
2、对象:生活中的每一实物都可以是一个对象
3、super():super可以调用父类的方法或属性。还可以调用父类构造器,只能在构造器中使用super(“张三”)格式。方法:super.sleep();属性:super.age;无参构造器:super();有参构造器:super(“张三”)。
public void study(){ super.sleep();//super调用父类的方法 System.out.println(super.age);//super用于调用父类属性 System.out.println(age); }
4、自动装箱与自动拆箱:
int i=9; int m=new Integer(9); //自动拆箱 Integer n=9; //自动装箱 System.out.println(i==n);//此时n自动拆箱
int m=new Integer(9); int n=new Integer(9); System.out.println(m==n); //此时m=n,原因:m与n自动拆包
5、instance of: A instanceof B
A是一个对象(使用new实例的对象)
B是一个类(不是方法名)
他表示A这个对象是否是B这个类的实例
if(animal2 instanceof Dog){ //instanceof判断是否为狗的对象 //强制类型转换 强制造型 ((Dog) animal2).voice(18); ((Dog) animal2).voice("lisi"); }
6、static关键字:修饰属性和方法。
修饰属性叫类的属性 类共有的
修饰方法叫类的方法 为类的方法以类调用
注:静态的方法中只能调用静态的属性
public static void eyesNum(){ //static类型的方法 System.out.println(2); } public static int eyes=2;//static类型属性
Dog wangcai=new Dog(); Animal.wangcai.add(4,5); Animal.eyesNum(); //调用静态方法 System.out.println(Animal.eyes);//调用静态属性
public static void eyesNum(){ System.out.println(2); } public static int eyes=2;
7、final关键字:
修饰类时表示最终的类,不允许被继承,没有子类。
final修饰方法时,方法不允许被复写。
final修饰变量时,将变量变为常量,不允许被修改。
8、静态常量书写格式: static final int EYE_NUM
注: 静态常量命名为全部大写字母用下划线隔开。
9、this与super:this是指当前对象自己
public Dog(){ this("黄毛"); //调用本类的构造器,必须写在第一行 //super调用父类构造器,必须写在第一行 } public Dog(String color){ }
public class Student extends Person { Student(){ //有一句隐式的super()调用父类的构造函数。 super("zhangsan"); } Student(String name){ super(name); //super()在使用时,必须在第一行 //this(name);//在构造器中使用this时,必须在第一行 System.out.println(name); }
10、object的重写
@Override public boolean equals(Object obj) { if(obj!=null){ if(obj instanceof Dog){ if( ((Dog)obj).id==this.id ) return true; } }
11.equals可以自己重新定义:equals+alt+/+回车
public int id; public String name; public boolean equals(Object obj) { if(obj!=null){ if(obj instanceof Dog){ if( ((Dog)obj).id==this.id ) return true; } } return false; }
Dog douDou=new Dog(); Dog baoBao=new Dog(); douDou.id=333; baoBao.id=333; douDou.name="豆豆"; baoBao.name="豆豆"; System.out.println(douDou==baoBao); System.out.println(douDou.equals(baoBao));
12、强制造型的格式:((类名)对象).方法();
Animal animal2=new Dog(); Animal animal3=new Cat(); animal.voice(); animal2.voice(); animal3.voice(); if(animal2 instanceof Dog){ //intanceof判断是否为狗的对象 //强制类型转换 强制造型 //把animal2这个对象强制转换为Dog类 ((Dog) animal2).voice(18); ((Dog) animal2).voice("lisi"); }
学习问题
System.out.println((douDou.getId()).equals((baoBao.getId())));
以上写法错误。
原因:由于equals为引用数据类型不能比较int类型的。正解如下:
System.out.println(douDou.equals(baoBao));
备注代码
package day03pm;public class Test { public static void main(String[] args) {// Dog dog=new Dog();// //方法重载 方法名相同 参数列表不同// dog.voice();// dog.voice("danfeng");// dog.voice(38); Animal animal=new Animal(); Animal animal2=new Dog(); Animal animal3=new Cat(); animal.voice(); animal2.voice(); animal3.voice(); if(animal2 instanceof Dog){ //intanceof判断是否为狗的对象 //强制类型转换 强制造型 ((Dog) animal2).voice(18); ((Dog) animal2).voice("lisi"); }// String s="123123";// Integer k=new Integer(11);// System.out.println(s+3);// System.out.println(k.parseInt(s)+3);// System.out.println(k.parseInt(s+3));// String s2="F2";// Integer h=new Integer(9);// System.out.println(h.parseInt(s2, 16)+3);// //多态 父类的引用指向子类的对象 //调用同样的方法产生的结果不同// String s1= new String("abc");// String s2=new String("abc");// String s3="abc";// String s4="abc";// System.out.println(s1==s2);// System.out.println(s1==s3);//s1栈,s2堆// System.out.println(s3==s4); int m=new Integer(9); int n=new Integer(9); System.out.println(m==n);// int i=9;// int j=9;// Integer k=new Integer (9);// Integer h=new Integer(9);// System.out.println(i==j);// System.out.println(k==h);// System.out.println(i==k);// int m=new Integer(9);//自动拆箱// Integer n=9;//自动装箱// System.out.println(i==n);//此时n自动拆箱// Dog wangcai=new Dog();// Animal.wangcai.add(4,5); // Animal.eyesNum();//调用静态方法// System.out.println(Animal.eyes);//调用静态属性// Dog dog=new Dog();// System.out.println(dog);// System.out.println(dog.toString());//输出与上一条相同// System.out.println(dog.hashCode());// String s1="19e0bfd" ;// System.out.println(Integer.parseInt(s1,16)); Dog douDou=new Dog(); Dog baoBao=new Dog(); douDou.id=333; baoBao.id=333; douDou.name="豆豆"; baoBao.name="豆豆"; System.out.println(douDou==baoBao); System.out.println(douDou.equals(baoBao));// Dog douDou=new Dog();// Dog baoBao=new Dog();// douDou.setId(333);// baoBao.setId(444);// douDou.setName("豆豆");// baoBao.setName("宝宝");// System.out.println(douDou.equals(baoBao)); }}
package day03pm;public class Dog extends Animal{ public Dog(){ this("黄毛"); //调用本类的构造器,必须写在第一行 //super调用父类构造器,必须写在第一行 } public Dog(String color){ } @Override//表示复写的方法 public void voice(){ System.out.println("汪汪汪"); //根据Animal可以看出这是一个子类中腹泻父类的方法(也叫重写) //方法的重写的特点: //1、方法名称相同 //2、返回值类型相同 //3、参数列表相同 //4、访问修饰符不能比父类更严格 }// // @Override// public void voice() {// // TODO Auto-generated method stub// super.voice();// } public void voice(String sex){ System.out.println("看见美女摇尾巴"); } public void voice (int age1){ int age=age1; if(age<=30) System.out.println("哇塞小鲜肉"); else System.out.println("老鲜肉"); } public static void eyesNum(){ System.out.println(2); } public static int eyes=2; public static int add(int a,int b){ return a+b; } public int id; public String name; @Override public boolean equals(Object obj) { if(obj!=null){ if(obj instanceof Dog){ if( ((Dog)obj).id==this.id ) return true; } } return false; }// private int id;// private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name;//get有返回值所以可以使String } public void setName(String name) { this.name = name;//set没有返回值所以是void }}
- Java面向对象的三大特征及学习心得
- java面向对象的三大特征
- Java面向对象的三大特征
- java面向对象的三大特征
- java面向对象的三大特征
- java面向对象的三大特征
- java面向对象的三大特征
- java---面向对象的三大特征
- Java面向对象的三大特征
- java面向对象的三大特征
- Java面向对象的三大特征
- Java面向对象的三大特征
- Java面向对象的三大特征
- Java面向对象的三大特征
- Java面向对象的三大特征:
- OC学习心得之面向对象三大特征
- java面向对象的三大特征,五大基本原则
- 面向对象基本理论及三大特征
- Binary Tree Maximum Path Sum
- 自动拆箱和装箱
- android用dp还是sp还是px等
- 关于Oc语言的继承与多态
- 黑马程序员---iOS基础---面向对象编程思想
- Java面向对象的三大特征及学习心得
- web——测试方法总结
- <Java>RandomAccessFile在文件中定位写入
- 学习ios开发很简单--oc篇 自定义类的工厂方法
- ActionContext.getContext()的几种用法
- 为什么要在catch块里写状态终止代码
- 杭电acm阶段之理工大版
- BLE CC2541串口调试
- 单片机延时C语言程序