java之面向对象3
来源:互联网 发布:人工智能的未来下载 编辑:程序博客网 时间:2024/05/17 23:16
代码块
代码块
1.局部代码块
局部变量位置:方法中 和 方法声明中
作用:限定了局部变量的生命周期(作用域问题)
2.构造代码块
位置:在类中 方法外
调用顺序:在你创建对象的时候 如果你有构造代码块
系统会帮你先调用构造代码块 再调用构造方法
作用:如果每个对象都有相同方法去执行
可以在构造代码中调用(开发中机会没有这样的场景)
3.静态代码块(使用static来修饰)
位置:在类中方法外
特点:只加载一次 并且随着类的加载而加载
应用场景:加载驱动(JDBC 数据库连接)
4.同步代码块(多线程)
public class Demo01 { static { System.out.println("我是Demo01 静态代码块"); } public static void main(String[] args) { // 局部代码块 { int num = 10; System.out.println(num); } // 用午餐构造 创建一个Person对象 // 用有参 创建一个Person //都调用 sayH方法 Person p= new Person(); }}class Person{ String name; int age; // public Person() { System.out.println("我是无参的构造方法"); } public Person(String name,int age) { this.name = name; this.age = age; System.out.println("我是有参的构造方法"); } public void sayHi() { System.out.println(name+"-----"+age); } // 构造代码块 { System.out.println("我是构造代码块"); } //静态代码块 static { System.out.println("我是静态代码块"); }}
输出结果
继承
继承特点:
1.减少重复的代码
2.减少你的工作量
3.可以把类中相同的代码抽取出来
继承不继承 要具体问题具体分析
什么时候使用继承?符合继承逻辑
举一个动物类的继承
class Animal{ String color; int leg; String name; public void sayHi() { System.out.println(color+"-----"+leg); }}class Cat extends Animal{}class Dog extends Animal{}
继承的规则
java中的继承
1.java中 值允许 单继承 不允许多继承(可以寄接口来实现多继承效果)
2.java中 允许 多层继承(属性方法会传递继承)
如果我想得到类中共有的方法和属性 使用哪个类
使用继承链最顶端的类
如果我想的到类中 特有的方法和属性 使用哪个类 使用最末端的类
如果一个类没有写继承那个类 实际上是继承了系统的类 Object类
Object类 是java 最顶端的类(基类)
多层继承的例子:
class DemoA extends Object{ String name; public void sayHi() { System.out.println(name); }}class DemoB extends DemoA{}class DemoC extends DemoB{}
继承中的构造方法
继承中的 构造方法
注意:构造方法是不能被继承的
1.为什么会打印爸爸无参构造方法?
要有儿子 先有爹 要初始化儿子类的对象 需要先去爸爸类中
调用构造方法
2.为什么儿子有参创建对象 也会打印爸爸无参构造方法?
下面的代码中会解释这个问题
class Father{ String name; public void sayHi() { System.out.println(name); } public Father(){ System.out.println("我是爸爸的 无参构造方法"); } public Father(String name){ this.name = name; System.out.println("我是爸爸的 有参构造方法"); }}class Son extends Father{ public Son() { // 如果你没有调用 父类的构造方法 // name系痛会在这里帮你调用一下父类无参构造方法 super(); //调用父类无参构造方法 System.out.println("我是儿子 无参的构造方法"); } public Son(String name) { // 不管你有参无参的构造方法 // 只要你没有调用父类的构造方法 系统都会帮你调用 // 保证继承完整性 super(); this.name = name; System.out.println("我是儿子 有参的构造方法"); }}
继承中方法的同名变量调用的优先级
首先 说明下子类中 this super的区别
1. this 在 类中代表的是本类的对象(当前类的对象)
2.super 在类中代表的是 父类的对象
this.属性 可以调用到当前类的属性(现在当前类找这个属性)
(没找到的话 回去父类里找)
super.属性:可以调用到父类的属性
this.(); 调用本类的构造方法
super.(); 调用父类的构造方法
下面举一个 同名变量调用的例子
class Fruit{ int num1 = 10; int num2 = 20;}class Apple extends Fruit{ int num2 = 30; public void print() { System.out.println(num1); System.out.println(num2);//这里会输出 子类中的30 而不是20 System.out.println(super.num2);//这里会输出父类中的20 }}
两个类继承中子类构造函数调用的情况
两个类继承关系
父类 没 有无参构造方法 ( 有 有参的构造方法)
子类的构造方法如何去写?
可以指定调用构造方法
class Car{ String name; public Car(String name) { this.name= name; System.out.println("Car我是有参数的构造方法"); }}class Audi extends Car{ public Audi() { // 只要你在构造方法的第一行 调用构造方法 // 这时系统将不再给你指定调用默认的无参构造方法 super("A8"); System.out.println("Audi 我是无参构造方法"); } public Audi(String name) { // 你不写父类构造 默认系统给你调用无参构造 // 你可以指定一个构造方法去调用 super(name);// 调用弗雷有参的构造方法 System.out.println("Audi 我是有参构造方法"); } public void sayHi() { System.out.println(name); }}
继承中的重写
当父类和子类有相同 成员方法时
class GlassCup extends Cup{ public void print() { // Override和Overload有什么区别? // Override 重写 // Overload 重载 // 当父类和子类方法完全一致时 叫做 方法重写 // super点 方法 可以调用父类的方法 // 重写的应用场景 当子类的方法 相对于父类的方法 有了升级 // 这是你可以使用方法的重写 // ios7 siri 只能英文 // ios8 siri 可以说英文 也能说中文 super.print(); System.out.println("我是玻璃杯"); }}class IOS7{ public void siri() { System.out.println("我能说中文"); }}class IOS8 extends IOS7{ // 这个方法标识 重写父类方法 @Override public void siri() { // TODO Auto-generated method stub // 这里调步调父类 要根据实际情况来写 super.siri(); System.out.println("功能升级 我能说中文了"); }}
继承中 父类成员私有化 子类该如何修改
举个例子
父类是人 子类是老师
class Man{ // 注意:私有属性 是不能被继承的(不是很准确) // 私有属性 可以继承下来 的 但是没有访问的权限 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; } //注意 私有属性是不能被继承的(不是很准确) private String name; private int age; public Man() { } public Man(String name,int age) { this.name=name; this.age=age; } public void eat() { System.out.println("吃饭"); }}class Teacher extends Man{ public Teacher() { } public Teacher(String name, int age) { //调用父类有参构造 super(name,age); } public void teach() { System.out.println(getName()+"教书"); } //继承set get方法 // 能不能通过 set/get 取访问和修改属性呢}
总结一下就是 父类中成员变量私有化之后
如果子类想修改就得通过 get的方法。
final关键字
final 关键字(绝育流)
1.修饰类 不能被继承
2.修饰变量 不能被修改
3.修饰方法 修饰方法时不能被重写
class Team{ // final 修饰的变量 相当于 常量(不能被修改的量) // 命名规则 名字全部大写 多单词用下划线分开 public static final double PIPI = 3.14; final int num; // 无效默认值 // final 赋值初值的两种方法 // 1,直接给初值 // 2. 从构造方法中赋值 public final void sayHi() { System.out.println(PIPI); }} class A extends Team{ public void sayHi() { //这里方法重写是报错的 } }
- java之面向对象3
- java之面向对象
- java之面向对象
- java之面向对象
- java之面向对象
- java之面向对象
- java 之 面向对象
- Java之面向对象
- Java之面向对象
- JAVA 之 面向对象
- JAVA之面向对象
- Java之面向对象
- Java之面向对象
- java之面向对象
- JAVA之面向对象
- java之面向对象
- Java之面向对象
- Java基础知识之面向对象(3)
- cs231n assigment1 KNN部分代码运行结果及分析
- matlab之apiori
- 计算机网络复习笔记(一)
- 闭包中变量值的改变
- 要点提炼|开发艺术之View
- java之面向对象3
- uip协议栈移植的原理图、pcb、原理图库、pcb库
- 剑指offer——面试题61:按之字形顺序打印二叉树
- CUDA 矩阵编写 小试牛刀
- 点分治学习笔记(2) tree
- LintCode_539_移动零
- 关于SQL宽字节注入的学习
- 利用优先队列PriorityQueue实现Prim算法
- 2017 年成为 Linux 专家的 4 个热门技能