java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

作者:王可利(Star·星星)

封装

    权限修饰符:public 公共的,private 私有的

    封装的步骤:

         1.使用private 修饰需要封装的成员变量。

         2.提供一个公开的方法设置或者访问私有的属性

             设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写

访问 通过get方法,命名格式:     get属性名();  属性的首字母要大写

1 //姓名设置器方法
2     public void setName(String name){
3         this.name = name;
4     }
5     //姓名访问器方法
6     public String getName(){
7         return name;
8     }

    代码书写的规范:java开发中一般类成员变量(属性),都是封装起来的 。

问题:是不是所有的属性都需要使用 set 和 get 方法?

    不一定,按照需求来定。

封装的作用:1. 框架  2. 工具类

封装的好处:1. 提高了数据的安全性   2. 操作简单   3. 隐藏了方法的实现。

 1 class Student{
 2     private String name;//成员变量被修饰之后只能在本类中进行访问了,私有的了。
 3     private String sex;//如果需要在外部进行访问,就需要访问方法了 set 和 get 方法。
 4     private int age;//需要收集,但是不公开,age 就只需要一个set方法就可以了
 5
 6     //两个参数的构造方法
 7     public Student (String name,String sex){
 8         this.name=name;
 9         if(sex.equals("男")||sex.equals("女")){
10             this.sex = sex;
11         }
12     }
13     //普通方法
14     public void study(){
15         System.out.println(name+"在学习");
16     }
17     //性别设置器方法
18     public void setSex(String sex){
19         if(sex.equals("男")||sex.equals("女")){
20             this.sex = sex;
21         }else{
22             System.out.println("你的输入不合法,请重新输入..");
23         }
24     }
25     //性别访问器方法
26     public String getSex(){
27         return sex;
28     }
29     //姓名设置器方法
30     public void setName(String name){
31         this.name = name;
32     }
33     //姓名访问器方法
34     public String getName(){
35         return name;
36     }
37     //age设置器
38     public void setAge(int age){
39         this.age = age;
40     }
41 }
42 public class fengzhuang {
43
44     public static void main(String[] args) {
45         Student star = new Student("星星","性别");//性别  是不合法的操作
46         star.study();
47         System.out.println(star.getSex());//性别 null
48     }
49 }

继承

特点:继承父类的属性和方法。 特性:方法的复写(重写)  单继承(多层继承)不是多继承,c++才是多继承一个子类N个父类。

java 中的继承 和 OC中一样。

继承的作用:优化代码,减少代码的重复使用

A:B OC中继承的写法,java中如何表现继承关系,用关键字 extends 表示继承。

继承中注意事项:

1.不要为了继承而继承,千万不要为了节省代码,任何关系都继承,这样就不伦不类了。

2.父类的私有成员变量是不能够被继承的。

3.父类的构造方法是不能被继承的。

4.父类的私有方法不能被继承。

5.子类调用自己的构造方法时,会默认调用父类中的无参构造方法。

6.子类不能够继承不在一个包中默认权限的成员变量。

为什么会调用父类的构造方法?
子类在创建对象的时候初始化父类的变量。

技巧:毕竟这两个属性是从父类上面继承下来的,初始化交给父类会好一点。。

super(name,sex);//一般由自己指定(定义),如果自己指定了下面的 super()就不可以调用了。

super();//调用的是父类的构造方法

this();//调用的是自己的构造方法

继承代码如下:

 1 package 面向对象的三大特性;
 2
 3 class Person{
 4     String name;//默认权限 friendly(友好的) private、public、protected
 5     String sex;
 6     Dog dog;//人和狗建立了 关联关系      整体->部分
 7     public void eat(){
 8         System.out.println(name+"在吃饭");
 9     }
10 }
11
12 //定于学生类继承父类
13 class Student extends Person{
14     int age;
15     public void study(){
16         System.out.println(name+"在学习");
17     }
18 }
19
20 public class jicheng {
21
22     public static void main(String[] args) {
23         Student s = new Student();
24         s.name = "WKL";//name 自己没有 父类有
25         s.age = 20;//age 自己有的
26         System.out.println(s.name+"今年"+s.age+"岁了..");
27     }
28 }

关联关系(不是继承):

 1 class person{
 2     String name;
 3     String sex;
 4     Dog dog;//人和狗建立了 关联关系      整体->部分
 5     public void eat(){
 6         System.out.println(name+"在吃饭");
 7     }
 8 }
 9
10 class Dog{
11     String name;
12     public void cry(){
13         System.out.println(name+"在叫");
14     }
15 }
16
17
18 public class jicheng {
19
20     public static void main(String[] args) {
21         person star = new person();
22         star.name = "星星";
23         Dog dog = new Dog();
24         dog .name = "小白";
25
26         star.dog = dog;//把狗这个对象 给 star的dog对象成员属性
27         /*dog.cry();*/
28         star.dog.cry();//星星的狗在叫
29         star.dog = null;
30         star.eat();
31     }
32 } 

super关键字(指向父类对象的引用空间)

作用:

1.当子类和父类存在同名的成员变量时,会先在子类里面找默认有一个this(this.name),可以通过super来调用父类的成员变量(super.name)。

2.super可以用来调用父类的构造方法。

super使用的注意的地方:

    1.用super调用父类构造方法,必须是构造方法中的第一个语句。

2.super只能出现在子类的方法或者构造方法中。

3.super 和 this 不能够同时调用构造方法。(因为this也是在构造方法的第一个语句)

总结:super 和 this 的区别:

   1.代表的事物不一样:

        this:代表所属方法的调用者对象。

        super:代表父类对象的引用空间。

    2.使用前提不一致:

        this:在非继承的条件下也可以使用。

        super:只能在继承的条件下才能使用。

     3.调用构造方法:

         this:调用本类的构造方法。

         super:调用的父类的构造方法

方法的复写(重写)

作用:父类的方法满足不了子类的实现,这个时候就需要通过复写(重写)方法再实现父类的行为。

方法的复写使用注意事项:

1.方法重写的时候,必须存在继承关系。

2.方法重写的时候,方法名和形式参数 必须跟父类是一致的。

3.方法重写的时候,子类的权限修饰符必须要大于或者等于父类的权限修饰符。( private < protected < public,friendly < public )

4.方法重写的时候,子类的返回值类型必须小于或者等于父类的返回值类型。(  子类 < 父类 )  数据类型没有明确的上下级关系

5.方法重写的时候,子类的异常类型要小于或者等于父类的异常类型。

方法的重载:方法名是一样的,只是参数列表的个数,类型,顺序不一样。

多态(一个对象同种类型不同表现形态

父类的引用类型指向了子类的对象。

多态使用注意事项:

1.多态情况下,父类 和 子类存在同名的成员变量,无论是静态的还是非静态的变量,默认访问的是父类中的成员变量。

2.多态情况下,父类 和 子类存在同名的非静态方法,访问的是子类的非静态方法。

3.多态情况下,父类 和子类存在同名的静态方法,访问的是父类的静态方法。

4.多态情况下,不能访问子类特有的属性、方法。

5.多态满足的条件:必须要有继承关系。

总结:多态情况下,子类 和 父类如果存在同名的成员,访问的都是父类,除了同名的非静态变量访问的才是子类。

java 编译器编译原理导致的。

编译看左边,运行不一定看右边。

编译看左边的意思:java 编译器在编译的时候会检测引用类型中含有指定的成员,如果没有就会报错。

 1 package study;
 2
 3 abstract class Animal{
 4     String name;
 5     static String color = "动物色";
 6
 7     public abstract void run();
 8
 9     public void eat(){
10         System.out.println("这个是父类中的方法");
11     }
12 }
13
14 class Dog extends Animal{
15     static String color = "黄色";
16     //重写父类中的方法
17     public void run(){
18         System.out.println(name+"用四条腿在跑步");
19     }
20     //重写父类中的eat方法
21     public void eat(){
22         System.out.println("这个是子类中的方法");
23     }
24 }
25
26 class Fish extends Animal{
27
28     //重写父类的方法
29     public void run(){
30         System.out.println(name+"在自由自在地游泳");
31     }
32 }
33
34 public class star {
35     public static void main(String[] args) {
36
37        Animal a = new Dog();//Animal 指针指向 Dog
38        a.name = "小黄";
39        a.run();
40
41        a.eat();
42        System.out.println(a.color);
43
44 //       a = new Fish();//Animal 指针指向 Fish
45 //       a.name = "小黄";
46 //       a.run();
47     }
48 }

多态使用的场景:

1.多态可以用于做形式参数,可以让方法接收更多的类型。

2.多态用于返回类型,可以返回更多的数据类型。

问题:

我返回的是圆的对象,不能用圆的引用变量来接收:返回的图形 -> 圆的父类

基本数据类型的转换:大的数据 -> 小的接收(强制转换)

 1 package study;
 2
 3 //需求1:定义一个方法可以接收任意类型 的图形对象,求面积和周长。
 4 //需求2:定于一个方法可以返回任意类型的图形。
 5 abstract class MyShape{
 6     //定义两个方法求面积和周长。
 7     public abstract void getArea();
 8     public abstract void getLength();
 9 }
10
11 class Circle extends MyShape{
12     int r;
13     final double PI = 3.14;
14
15     //重写父类中的方法
16     public void getArea(){
17         System.out.println("圆的面积");
18     }
19     public void getLength(){
20         System.out.println("圆的周长");
21     }
22 }
23
24 class Rect extends MyShape{
25
26     public void getArea(){
27         System.out.println("矩形的面积");
28     }
29     public void getLength(){
30         System.out.println("矩形的周长");
31     }
32 }
33
34 public class star {
35     public static void main(String[] args) {
36
37         //需求1:定义一个方法可以接收任意类型 的图形对象,求面积和周长。
38         getAreaAndLength(new Circle());
39         getAreaAndLength(new Rect());
40
41         //需求2:定于一个方法可以返回任意类型的图
42         MyShape a = getMyShape(0);//圆
43         /*getAreaAndLength(a);//在这里拿到的是哪个型就计算哪个的面积和周长。*/
44
45         Circle c = (Circle)a;//引用数据类型的强制转换
46         getAreaAndLength(c);//在这里拿到的是哪个型就计算哪个的面积和周长。
47     }
48
49     public static void getAreaAndLength(MyShape ms){//这个参数拿到的是父类的对象,凡是属于这个父类的都可以使用这个方法。如果是圆就只能接收圆的
50         ms.getArea();
51         ms.getLength();
52     }
53
54     public static MyShape getMyShape(int i){
55         if (i == 0) {
56             return new Circle();//圆
57         }else if (i == 1) {
58             return new Rect();//矩形
59         }
60         return null;
61     }
62 }
时间: 2024-10-10 10:51:02

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)的相关文章

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

Java面向对象三大特性 封装 继承 多态

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get

面向对象三大特性:封装,继承,多态(一,封装和继承)

封装.继承和多态是面向对象程序设计的三个核心特性. 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想. 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂.更深入的程序开发. 多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易. 一.封装 封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,

面向对象三大特性:封装,继承,多态(二、多态)

多态 一,多态的概念 多态(polymorphism), 是指一个名字可以有多种语义.在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类.多态性使得向系统里增加新功能变得容易.继承性和多态性是降低软件复杂性有有效技术. 二,多态的实现 1.方法的重载 方法重载时: 参数必须不同.参数个数不同或类型不同. 返回值可以相同,也可以不同. 重载的价值在于它允许通过使用一个

Python全栈开发——面向对象的三大特性(继承 &amp; 多态 &amp;封装)

1.继承 1.两层意思改变和扩展(详细看随笔继承和组合) 2.多态(体现在运行时的状态) 1.不同的类可以调用相同的方法,得到不同的结果 2.实际上是继承的一种体现机制 class H2o: def __init__(self,name,temperature): self.name=name self.temperature=temperature def turn_ice(self): if self.temperature<0: print('温度太低,变成[%s]' %self.name

面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)

多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型.,根据其实际的类型调用其相应的方法. 多态也叫动态绑定,也叫迟绑定. 多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象

java基础篇(二) ----- java面向对象的三大特性之继承

java面向对象的三大特性之继承: 复用代码是java众多引人注目的功能之一,但是想要成为极具革命性的语言,仅仅是复制代码并对其加以改变是不够的.它必须能够做更多的事.引自<Think in java>    而代码复用也是程序员一直不断追求的.由此来说下代码复用的一种方式 java面向对象的三大特性--继承!! 在面向对象程序设计中,继承机制可以有效地组织类的结构.确定类之间的关系,在已有类的基础上开发新的类.继承机制在程序代码复用.提高软件开发效率.降低软件系统维护成本等方面具有重要作用.