Day09
代码块的概述和分类
class Demo1_Code {
public static void main ( String[ ] args) {
{
int x = 10 ;
System. out. println ( x) ;
}
Student s1 = new Student ( ) ;
System. out. println ( "------------" ) ;
Student s2 = new Student ( "李四" , 23 ) ;
System. out. println ( "------------" ) ;
Student s3 = new Student ( "李四" , 23 ) ;
System. out. println ( "------------" ) ;
Student s4 = new Student ( "李四" , 23 ) ;
}
static {
System. out. println ( "我是在主方法中的代码块" ) ;
}
class Student {
private String name;
private int age;
public Student ( ) {
System. out. println ( "空参构造" ) ;
}
public Student ( String name, int age) {
this . name = name;
this . age = age;
System. out. println ( "有参构造" ) ;
}
public void setName ( String name ) {
this . name = name ;
}
public String getName ( ) {
return name;
}
public void setAge ( int age) {
this . age = age;
}
public int getAge ( ) {
return age;
}
{
study ( ) ;
}
public void study ( ) {
System. out. println ( "学生学习" ) ;
}
static {
System. out. println ( "我是静态代码块" ) ;
}
}
class Demo2_Student {
static {
System. out. println ( "Demo2_Student静态代码块" ) ;
}
public static void main ( String[ ] args) {
System. out. println ( "我是主方法" ) ;
Student s1 = new Student ( ) ;
Student s2 = new Student ( ) ;
}
}
class Student {
static {
System. out. println ( "Student静态代码块" ) ;
}
{
System. out. println ( "Student构造代码块" ) ;
}
public Student ( ) {
System. out. println ( "Student构造方法(空参构造)" ) ;
}
}
继承
继承的概述
class Demo1_Extends {
public static void main ( String[ ] args) {
Cat c = new Cat ( ) ;
c. color = "花" ;
c. leg = 4 ;
c. eat ( ) ;
c. sleep ( ) ;
System. out. println ( "猫是一只" + c. color + "猫" + ",腿的个数是" + c. leg + "个" ) ;
}
}
class Cat extends Animal {
}
class Dog extends Animal {
}
class Animal {
String color;
int leg;
public void eat ( ) {
System. out. println ( "吃飯" ) ;
}
public void sleep ( ) {
System. out. println ( "睡觉" ) ;
}
}
继承的好处与弊端
A: 继承的好处:
* 提高了代码的复用性;
* 提高了代码的维护性; ( 父类增加属性和方法, 子类便会继承) ;
* 让类与类产生关系, 是多态的前提;
B: 继承的弊端:
* 提高了代码的耦合性; ( 父与子的关系太密切) ;
* 开发的原则: 高内聚, 低耦合
* 耦合: 类与类的关系;
* 内聚: 就是完成某件事情的能力;
类的继承特点:
class Demo2_Extends {
public static void main ( String[ ] args) {
DemoC c = new DemoC ( ) ;
c. show ( ) ;
}
}
class DemoA {
public void show ( ) {
System. out. println ( "Demo_A" ) ;
}
}
class DemoB extends DemoA {
public void show ( ) {
System. out. println ( "Demo_B" ) ;
}
}
class DemoC extends DemoB {
public void show ( ) {
System. out. println ( "Demo_C" ) ;
}
}
继承的注意事项和使用环境
继承中成员变量的关系
class Demo4_Extends {
public static void main ( String[ ] args) {
Son s = new Son ( ) ;
s. print ( ) ;
}
}
class Father {
int num1 = 10 ;
int num2 = 30 ;
}
class Son extends Father {
int num2 = 20 ;
public void print ( ) {
System. out. println ( num1) ;
System. out. println ( num2) ;
}
}
this和super的区别
class Son extends Father {
int num2 = 20 ;
public void print ( ) {
System. out. println ( this . num1) ;
System. out. println ( super . num2) ;
}
}
继承中构造方法的关系
class Demo5_Extends {
public static void main ( String[ ] args) {
Son s = new Son ( ) ;
}
}
class Father {
public Father ( ) {
System. out. println ( "Father的构造方法" ) ;
}
}
class Son extends Father {
public Son ( ) {
super ( ) ;
System. out. println ( "Son的构造方法" ) ;
}
}
继承中构造方法的注意事项
class Demo6_Extends {
public static void main ( String[ ] args) {
Son s1 = new Son ( ) ;
System. out. println ( s1. getName ( ) + "------" + s1. getAge ( ) ) ;
System. out. println ( "-----------" ) ;
Son s2 = new Son ( "张三" , 23 ) ;
System. out. println ( s2. getName ( ) + "------" + s2. getAge ( ) ) ;
}
}
class Father {
private String name;
private int age;
public Father ( String name , int age) {
this . name = name ;
this . age = age;
System. out. println ( "Father有参构造" ) ;
}
public void setName ( String name) {
this . name = name;
}
public String getName ( ) {
return name;
}
public void setAge ( int age) {
this . age = age;
}
public int getAge ( ) {
return age;
}
}
class Son extends Father {
public Son ( ) {
this ( "王五" , 25 ) ;
System. out. println ( "Son的空参构造" ) ;
}
public Son ( String name, int age) {
super ( name, age) ;
System. out. println ( "Son的有参构造" ) ;
}
}
class Test2_Extends {
public static void main ( String[ ] args) {
Zi z = new Zi ( ) ;
}
}
class Fu {
static {
System. out. println ( "静态代码块Fu" ) ;
}
{
System. out. println ( "构造代码块Fu" ) ;
}
public Fu ( ) {
System. out. println ( "构造方法Fu" ) ;
}
}
class Zi extends Fu {
static {
System. out. println ( "静态代码块Zi" ) ;
}
{
System. out. println ( "构造代码块Zi" ) ;
}
public Zi ( ) {
System. out. println ( "构造方法Zi" ) ;
}
}
继承中成员方法关系
A: 案例演示
* a: 不同命方法;
* b: 同名方法;
class Demo7_Extends {
public static void main ( String[ ] args) {
Son s = new Son ( ) ;
s. print ( ) ;
s. method ( ) ;
}
}
class Father {
public void print ( ) {
System. out. println ( "Fu print" ) ;
}
}
class Son extends Father {
public void print ( ) {
super . print ( ) ;
System. out. println ( "Zi print" ) ;
}
public void method ( ) {
System. out. println ( "Zi method" ) ;
}
}
方法重写
方法重写的概述
class Demo7_Phone {
public static void main ( String[ ] args) {
Ios8 i = new Ios8 ( ) ;
i. call ( ) ;
i. siri ( ) ;
}
}
class Ios7 {
public void call ( ) {
System. out. println ( "打电话" ) ;
}
public void siri ( ) {
System. out. println ( "speak english" ) ;
}
}
class Ios8 extends Ios7 {
public void siri ( ) {
super . siri ( ) ;
System. out. println ( "说中文" ) ;
}
}
方法重写的注意事项
/*
A:方法重写的注意事项:
*a:父类中私有方法不能被重写;
因为父类中的私有方法无法继承;
*b:子类重写父类方法时,访问权限不能更低;
*最好一致;
*c:父类静态方法,子类也必须通过静态方法进行重写;
*其实这个算不上重写,但是现象确实如此,至于为什么算不上重写,多态中讲解
*子类重写父类,方法声明最好是一模一样;
B:案例演示
*方法重写注意事项
*/
方法重写相关的面试题
A: 方法重写的相关面试题
Override和Overload的区别? Overload能改变返回值类型吗?
* Overload ( 重载) : 可以改变返回值类型, 只看参数列表;
* 方法重写: 子类中出现和父类中方法声明一模一样的方法, 与返回值类型有关, 返回值是一致的( 或者是子父类的)
* 方法重载: 本类中出现的方法名一样, 参数列表不同的方法, 与返回值类型无关
子类对对象调用方法的时候:
先找子类本身, 再找父类;
继承案例演示
class Test4_Person {
public static void main ( String[ ] args) {
Student s1 = new Student ( ) ;
s1. setName ( "李四" ) ;
s1. setAge ( 23 ) ;
System. out. println ( s1. getName ( ) + "----------" + s1. getAge ( ) ) ;
s1. eat ( ) ;
s1. study ( ) ;
System. out. println ( "----------" ) ;
Student s2 = new Student ( "张三" , 24 ) ;
System. out. println ( s2. getName ( ) + "----------" + s2. getAge ( ) ) ;
s2. eat ( ) ;
s2. study ( ) ;
}
}
class Person {
private String name;
private int age;
public Person ( ) { } ;
public Person ( String name, int age) {
this . name = name;
this . age = age;
}
public void setName ( String name) {
this . name = name ;
}
public String getName ( ) {
return name;
}
public void setAge ( int age) {
this . age = age;
}
public int getAge ( ) {
return age;
}
public void eat ( ) {
System. out. println ( name + "吃飯" ) ;
}
}
class Student extends Person {
public Student ( ) { } ;
public Student ( String name, int age) {
super ( name, age) ;
}
public void study ( ) {
System. out. println ( getName ( ) + "学习" ) ;
}
}
class Teacher extends Person {
public Teacher ( ) { } ;
public Teacher ( String name, int age) {
super ( name, age) ;
}
public void teach ( ) {
System. out. println ( "老师讲课" ) ;
}
}
动物, 猫狗类
class Test5_Animal {
public static void main ( String[ ] args) {
Cat c1 = new Cat ( ) ;
c1. setColor ( "white" ) ;
c1. setLeg ( 4 ) ;
System. out. println ( c1. getColor ( ) + "--------" + c1. getLeg ( ) ) ;
c1. eat ( ) ;
c1. catchMouse ( ) ;
System. out. println ( "--------" ) ;
Cat c2 = new Cat ( "black" , 4 ) ;
System. out. println ( c2. getColor ( ) + "--------" + c2. getLeg ( ) ) ;
c2. eat ( ) ;
c2. catchMouse ( ) ;
System. out. println ( "--------" ) ;
Dog d = new Dog ( "花" , 4 ) ;
System. out. println ( d. getColor ( ) + "--------" + d. getLeg ( ) ) ;
d. eat ( ) ;
d. watchDog ( ) ;
}
}
class Animal {
private String color;
private int leg;
public Animal ( ) { } ;
public Animal ( String color, int leg) {
this . color = color;
this . leg = leg;
}
public void setColor ( String color) {
this . color = color;
}
public String getColor ( ) {
return color;
}
public void setLeg ( int leg) {
this . leg = leg;
}
public int getLeg ( ) {
return leg;
}
public void eat ( ) {
System. out. println ( "吃食" ) ;
}
}
class Cat extends Animal {
public Cat ( ) { } ;
public Cat ( String color, int leg) {
super ( color, leg) ;
}
public void catchMouse ( ) {
System. out. println ( "猫捉老鼠" ) ;
}
}
class Dog extends Animal {
public Dog ( ) { } ;
public Dog ( String color, int leg) {
super ( color, leg) ;
}
public void watchDog ( ) {
System. out. println ( "看家护院" ) ;
}
}
final关键字
class Demo1_Final {
public static void main ( String[ ] args) {
Son s = new Son ( ) ;
s. print ( ) ;
}
}
class Son {
final int NUM = 10 ;
public static final double PI = 3.14 ;
public void print ( ) {
System. out. println ( NUM) ;
}
}
final关键字修饰局部变量
class Demo2_Final {
public static void main ( String[ ] args) {
final int NUM = 10 ;
System. out. println ( NUM) ;
final Person p = new Person ( "张三" , 23 ) ;
p. setName ( "李四" ) ;
p. setAge ( 24 ) ;
System. out. println ( p. getName ( ) + "------" + p. getAge ( ) ) ;
method ( 10 ) ;
method ( 20 ) ;
}
public static void method ( final int x) {
System. out. println ( x) ;
}
}
class Person {
private String name;
private int age;
public Person ( ) { } ;
public Person ( String name, int age) {
this . name = name;
this . age = age;
}
public void setName ( String name) {
this . name = name;
}
public String getName ( ) {
return name;
}
public void setAge ( int age) {
this . age = age;
}
public int getAge ( ) {
return age;
}
}
final修饰变量的初始化时机
class Demo3_Final {
public static void main ( String[ ] args) {
Demo d = new Demo ( ) ;
d. print ( ) ;
}
}
class Demo {
final int num;
public Demo ( ) {
num = 10 ;
}
public void print ( ) {
System. out. println ( num) ;
}
}