java面向对象
java面向对象的三大特性:封装、继承、多态
类和对象的关系:
类是对象的抽象描述,类名并包括属性和方法两个主要部分
一、封装
例:
1 package Zsh.SuiSui03; 2 3 class FengZhuangDemoss{ 4 public static void main(String[] args){ 5 Parson p = new Parson(); 6 p.setAge(-10); 7 System.out.println(p.age); 8 9 p.setAge(-10); 10 System.out.println(p.age); 11 p.setName("张三"); 12 System.out.println(p.getName()); 13 14 // Student student = new Student(); 15 // p.say(Student);//匿名对象 16 // p.say(Student);//与上一行相同 17 18 19 p.say(new Student());//匿名对象,只能用一次,如果需要再次使用要再次new一个对象 20 p.say(new Student()); 21 } 22 } 23 24 class Parson { 25 int age; 26 private String name;//封装 27 28 public void setAge (int a){ 29 if(a<0){//传入的参数不符合常理 30 a = 20; 31 }else{ 32 age = a; 33 } 34 } 35 36 public void setName(String str){ 37 this.name = str; 38 } 39 public String getName(){ 40 return name; 41 } 42 // public void setName(String name){ 43 // this.name = name; 44 // } 45 public void speak(){ 46 System.out.println(name + age + "讲话!!!"); 47 } 48 public void say(Student student){ 49 System.out.println("学生类"); 50 } 51 public void testThis(){ 52 System.out.println(this); 53 } 54 }
二、构造器
构造方法——构造器(Constructor)
构造方法:
- 方法名字和类名一样,不允许修改,不需要写return
- 没有返回值类型,void不能写
- 方法的重载 :方法名一样,入参不一样,返回值类型不一样。代码的复用性高
- 运行:只要new对象,就运行,不允许手动调用,在new对象时,只运行一次
- 作用:建立对象的同时,给对象初始化
- 默认构造方法:类名一样,没有参数的构造方法,如果手动写了,编译的时候就不会添加默认方法
//无参构造方法:
People p = new People();
//有参构造方法:
People p = new People(10);
编写方法:
class People{
People(){
//无参构造方法()没有参数
}
People(int age){
//有参构造方法(int age)有参数
}
}
例:
1 package Zsh.SuiSui03; 2 /* 3 构造方法 4 */ 5 6 public class ConstructorDemoss { 7 public static void main(String[] args){ 8 // Sumss s = new Sumss(10,20); 9 // int sum = s.getSum(); 10 // System.out.println(sum); 11 12 Rectangle re = new Rectangle(5,8); 13 int length = re.getlength(); 14 int square = re.getsquare(); 15 System.out.println("长方形的周长="+length); 16 System.out.println("长方形的面积="+square); 17 } 18 } 19 /* 20 构造方法——构造器(Constructor) 21 22 构造方法: 23 1.方法名字和类名一样,不允许修改,不需要写return 24 2.没有返回值类型,void不能写 25 3.方法的重载 :方法名一样,入参不一样,返回值类型不一样。代码的复用性高 26 4.运行:只要new对象,就运行,不允许手动调用,在new对象时,只运行一次 27 5.作用:建立对象的同时,给对象初始化 28 6.默认构造方法:类名一样,没有参数的构造方法,如果手动写了,编译的时候就不会添加默认方法 29 30 //无参构造方法: 31 People p = new People(); 32 //有参构造方法: 33 People p = new People(10); 34 */ 35 /* 36 编写方法: 37 class People{ 38 People(){ 39 //无参构造方法()没有参数 40 41 } 42 People(int age){ 43 //有参构造方法(int age)有参数 44 } 45 } 46 */ 47 class People{ 48 String name; 49 int age; 50 People (){ 51 this("岁岁",20); 52 } 53 People(String name,int age){ 54 this.name = name; 55 this.age = age; 56 } 57 58 public void setName(String name) { 59 this.name = name; 60 } 61 62 public void setAge(int age) { 63 this.age = age; 64 } 65 66 public String getName() { 67 return name; 68 } 69 70 public int getAge() { 71 return age; 72 } 73 } 74 75 class Sumss { 76 //定义一个类sum,其中定义一个求两个数据和的方法(用构造方法) 77 private int a; 78 private int b; 79 Sumss (int a, int b){//初始化 80 this.a = a; 81 this.b = b; 82 } 83 public int getSum(){ 84 return a+b; 85 } 86 } 87 88 class Rectangle { 89 //定义长方形类,提供两个方法,计算面积周长 90 private int width; 91 private int height; 92 93 Rectangle(int x,int y){ 94 this.width = x; 95 //定义一个宽 96 this.height = y; 97 //定义一个长 98 } 99 public int getlength(){ 100 return 2*(this.height+this.width); 101 } 102 public int getsquare(){ 103 return this.height*this.width; 104 } 105 }
三、继承:
1.继承的由来
要求:定义学生类(姓名,年龄,学习方法)
定义老师类(姓名,年龄,上课方法)
定义工人类(姓名,年龄,上班方法)
发现三个类中,出现了重复的内容,年龄和姓名
避免重复性,共性抽取出来,放在单独的一个类中,三个类都可以直接使用
让这些类产生关系,继承关系
继承:类和类之间的关系
新的关键字 extends (扩展,延伸)
格式: class A类 extends B类
A类继承B类
Student类,称为Person类的子类
Person类,称为Student类的父类,超类,基类
子类可以直接用父类的成员(不是全部)
2.继承的好处:
代码量减少
提高可维护性
继承使类和类之间产生了关系,导致了面向对象的三大特征,多态的诞生
Human h =
支持单继承,一个类只能直接继承一个类,不能同时继承多个类
一个子类只能有一个直接父类
支持多层继承
3.继承中的注意事项:
子类可以使用父类的成员(变量,方法),父类私有的子类不可以使用
弊端:打破类封装性
子类不能继承父类的构造方法:方法名不一样
不要为了继承而继承,继承后拥有父类全部内容
4.继承后子类和父类成员的变化
成员变量,构造方法,成员方法
成员变量:
子类有——使用子类自己的
子类没有——使用父类的
子类父类都没有——编译失败
方法就近访问原则,变量方法自己有就用自己的
在子类中,访问父类的成员,新的关键字super
变量:super.父类成员
方法:super()
super父类存储空间标识,this
例:
1 package Zsh.SuiSui03; 2 3 public class ExtendsDemoss { 4 /* 5 继承 6 */ 7 8 public static void main(String[] args) { 9 // Students s = new Students(); 10 // Teachers t = new Teachers(); 11 // s.name = "如懿"; 12 // t.name = "魔法小厨娘老师"; 13 // s.sleep(); 14 // s.drink(); 15 // s.eat(); 16 // t.sleep(); 17 // t.eat(); 18 // t.drink(); 19 20 Zi zi = new Zi(1); 21 22 } 23 } 24 25 class Human 26 { 27 String name; 28 public void sleep(){ 29 System.out.println(name+ " 睡觉 "); 30 } 31 public void eat(){ 32 System.out.println(name+ " 吃饭 "); 33 } 34 public void drink(){ 35 System.out.println(name+ " 喝水 "); 36 } 37 } 38 class Students extends Human 39 { 40 41 } 42 class Teachers extends Human 43 { 44 45 } 46 47 class Fu 48 { 49 String name; 50 int age; 51 Fu(){ 52 System.out.println("这是父类的无参构造方法"); 53 } 54 Fu(int age){ 55 System.out.println("这是父类的有参构造方法" + age); 56 } 57 } 58 59 class Zi extends Fu 60 { 61 String name; 62 Zi(){ 63 System.out.println("这是子类的无参构造方法"); 64 } 65 Zi(int age){ 66 super(1); 67 System.out.println("这是子类的有参构造方法" + age); 68 } 69 70 // public void say(String name){ 71 // System.out.println(name); 72 // } 73 }