1,组合(composition):
新的类由现有的类的对象组成,这种方法称为组合;
2,继承:按照现有类的类型来创建新类,无需改变现有类的形式。
3,带参数的构造器
class Game {
Game(int i) {
print("Game constructor");
}
}
class BoardGame extends Game {
BoardGame(int i) {
super(i);//调用父类构造器
print("BoardGame constructor");
}
}
public class Chess extends BoardGame {
Chess() {
super(11);//调用父类构造器
print("Chess constructor");
}
public static void main(String[] args) {
Chess x = new Chess();
}
} /* Output:
4,名字屏蔽
如果java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称,不会屏蔽其在基类中的任何版
本,这与c++不同。因此,无论在该层或它的基类中对方法进行定义,重载机制都可以正常工作。
class Homer {
char doh(char c) {
print("doh(char)");
return 'd';
}
float doh(float f) {
print("doh(float)");
return 1.0f;
}
}
class Milhouse {}
class Bart extends Homer {
void doh(Milhouse m) {
print("doh(Milhouse)");
}
}
public class Hide {
public static void main(String[] args) {
Bart b = new Bart();
b.doh(1);
b.doh('x');
b.doh(1.0f);
b.doh(new Milhouse());
}
} /* Output:
输出结果是:
doh(float)
doh(char)
doh(float)
doh(Milhouse)
jdk5中新增加了@Override注解,它不是关键字,但是可以当做关键字使用。当你想要覆盖某个方法时,可以
选择添加这个注解,在你不小心重载而并非覆盖了该方法时,编译器会报错。
class Lisa extends Homer {
@Override char doh(char c) {
System.out.println("doh(Milhouse)");
return 'd';
}
} ///:~
5,final关键字
1 final 数据
- 一个永不改变的编译时常量;
- 一个在运行时被初始化的值,你不希望它被改变。
一个既是static又是final的域只占据一段不能改变的存储空间。
对于基本类型,final使得数据恒定不变,而对于对象引用,final使引用恒定不变,一旦引用被初始化指向一个对象,就无
法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的。
class Value {
int i; // Package access
public Value(int i) { this.i = i; }
}
public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id) { this.id = id; }
// Can be compile-time constants:
private final int valueOne = 9;
private static final int VALUE_TWO = 99;
// Typical public constant:
public static final int VALUE_THREE = 39;
// Cannot be compile-time constants:
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
private static final Value VAL_3 = new Value(33);
// Arrays:
private final int[] a = { 1, 2, 3, 4, 5, 6 };
public String toString() {
return id + ": " + "i4 = " + i4 + ", INT_5 = " + INT_5;
}
public static void main(String[] args) {
FinalData fd1 = new FinalData("fd1");
// fd1.valueOne++; // Error: can't change value
fd1.v2.i++; // Object isn't constant!
fd1.v1 = new Value(9); // OK -- not final
for(int i = 0; i < fd1.a.length; i++)
fd1.a[i]++; // Object isn't constant!
// fd1.v2 = new Value(0); // Error: Can't
// fd1.VAL_3 = new Value(1); // change reference
// fd1.a = new int[3];
print(fd1);
print("Creating new FinalData");
FinalData fd2 = new FinalData("fd2");
print(fd1);
print(fd2);
}
} /* Output:
6,空白final
指被声明为final但又未定初始值的域
class Poppet {
private int i;
Poppet(int ii) { i = ii; }
}
public class BlankFinal {
private final int i = 0; // Initialized final
private final int j; // Blank final
private final Poppet p; // Blank final reference
// Blank finals MUST be initialized in the constructor:
public BlankFinal() {
j = 1; // Initialize blank final
p = new Poppet(1); // Initialize blank final reference
}
public BlankFinal(int x) {
j = x; // Initialize blank final
p = new Poppet(x); // Initialize blank final reference
}
public static void main(String[] args) {
new BlankFinal();
new BlankFinal(47);
}
} ///:~
7,final参数
class Gizmo {
public void spin() {}
}
public class FinalArguments {
void with(final Gizmo g) {
// g = new Gizmo(); // 非法,不能修改
}
void without(Gizmo g) {
g = new Gizmo(); // OK -- g not final
g.spin();
}
// void f(final int i) { i++; } // 不能改变
// You can only read from a final primitive:
int g(final int i) { return i + 1; }
public static void main(String[] args) {
FinalArguments bf = new FinalArguments();
bf.without(null);
bf.with(null);
}
} ///:~
8,final方法
1,把方法锁定,防止任何继承类修改它的含义;
2,确保在继承中该方法保持不变,并且不会被覆盖。
类中所有的private方法都隐式的制定为final的。
class WithFinals {
// Identical to "private" alone:
private final void f() { print("WithFinals.f()"); }
// Also automatically "final":
private void g() { print("WithFinals.g()"); }
}
class OverridingPrivate extends WithFinals {
private final void f() {
print("OverridingPrivate.f()");
}
private void g() {
print("OverridingPrivate.g()");
}
}
class OverridingPrivate2 extends OverridingPrivate {
public final void f() {
print("OverridingPrivate2.f()");
}
public void g() {
print("OverridingPrivate2.g()");
}
}
public class FinalOverridingIllusion {
public static void main(String[] args) {
OverridingPrivate2 op2 = new OverridingPrivate2();
op2.f();
op2.g();
// You can upcast:
OverridingPrivate op = op2;
// But you can't call the methods:
// op.f();
//! op.g();
// Same here:
WithFinals wf = op2;
//! wf.f();
//! wf.g();
}
} /* Output:
9,final类
由于final类禁止继承,所以final类中所有的方法都隐式的指定为fina的,因为无法覆盖它们。
10,类的代码在初次使用时才会加载,这通常指加载发生在创建类的第一个对象之时,但是当访问static域或static方法
时,也会发生加载。
class Insect {
private int i = 9;
protected int j;
Insect() {
print("i = " + i + ", j = " + j);
j = 39;
}
private static int x1 =
printInit("static Insect.x1 initialized");
static int printInit(String s) {
print(s);
return 47;
}
}
public class Beetle extends Insect {
private int k = printInit("Beetle.k initialized");
public Beetle() {
print("k = " + k);
print("j = " + j);
}
private static int x2 =
printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
print("Beetle constructor");
Beetle b = new Beetle();
}
} /* Output:
运行结果:
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39
分享到:
相关推荐
第七章探讨了类的继承和复用。继承是一种重要的面向对象特性,允许一个类继承另一个类的属性和方法。本章讲解了如何定义子类、覆盖父类的方法以及使用super关键字调用父类的构造函数等内容。通过继承,可以提高代码...
由于提供的文件内容中,...如果要学习Java,最好的方式是从学习Java的基础语法和面向对象编程思想入手,逐步深入到类库使用和Java高级特性,同时实践相关的设计模式和架构设计,这样可以更全面地掌握Java编程的精髓。
- Java作为一种广泛使用的编程语言,其学习路径包括掌握基本语法、理解面向对象编程思想、熟悉标准库使用等。 - **JAVA发展概述** - Java的发展历程:从1995年由Sun Microsystems公司发布以来,Java经历了多次重大...
### Java基本语法学习—方法部分笔记 #### 一、方法的概念与重要性 在Java语言中,**方法**是程序设计的重要组成部分,它不仅能够帮助我们实现代码的复用,提高开发效率,还体现了面向对象编程的核心思想之一——*...
本资源包含了这本书第四版的学习笔记和源代码,旨在帮助读者更好地理解和掌握Java编程思想。以下是对这些知识点的详细阐述: 1. **面向对象编程(OOP)**:Java是一种纯面向对象的语言,它强调类、对象、封装、继承...
【Java基础辅导班教程课件】是针对初学者设计的一系列教学资源,旨在帮助学习者扎实掌握Java编程语言的基础知识。第01期第7天的课程内容可能涵盖了上一阶段学习的巩固以及新的概念引入,确保学员能够逐步建立起完整...
《李兴华J2SE全面解析笔记》 Java平台的标准版(Java Standard Edition,简称J2SE)是...通过系统学习这些笔记,读者不仅可以理解Java语法,还能掌握Java编程的核心思想,为进一步提升到Java企业级开发打下坚实基础。
Java是一种广泛使用的编程语言,以其跨平台性和强大的功能而闻名。以下是对《2023年Java基础总结大全笔记》的详细...以上就是对Java基础的详尽解析,涵盖了从基本概念到高级特性的多个方面,是学习Java编程的良好起点。
1. **Java语法基础**:Java的基础语法与C++相似,但更加强调面向对象的编程思想。变量、数据类型、运算符、流程控制语句(如if、for、while)是学习Java的起点。Java中的类和对象是其核心概念,理解类的定义、对象的...
- **课程亮点**:本课程强调设计模式的实用性和趣味性,通过实例引导学习,深入剖析设计模式背后的编程思想。 - **授课模式**:采用“提出应用场景—引出设计模式—剖析原理—分析实现步骤—代码实现—源码分析”的...
### 学习笔记: 抽象封装、继承、多态 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。对象是由数据(即字段或属性)和对这些数据进行...