Java SE 7 Silver 試験対策セミナーで模擬問題の解説をマークダウンでメモってみた
2015/03/29
Java SE 7 Silver 試験対策セミナーに行って、模擬問題にチャレンジしてきました。
問題の解説をAtomを使ってマークダウンでメモしてたので、JetPack Markdownを使ってそのまま記事にしてみました。
※あくまでもメモなので、なんとなくで読んでもらえば幸いです。
スコープ
[java]
package ken;
class Target{
public String name = "hello";
}
[/java]
- nameはkenパッケージ内のすべてのクラスが直接アクセスして編集可能
アクセス修飾子 | クラス | コンストラクタ | メンバ変数 | メソッド | 説明 |
---|---|---|---|---|---|
public | o | o | o | o | どのクラスからでも |
protected | x | o | o | o | このクラスを継承したサブクラス、もしくは同一パッケージ内のクラスから |
デフォルト(指定なし) | o | o | o | o | 同一パッケージ内のクラスからのみ |
private | x | o | o | o | 同一クラス内からのみ |
※リフレクションを使用した場合を除く
[java]
package util;
public class BuiltUtils{
private static void process(byte[] b){
}
}
[/java]
[java]
package app;
public class someApp{
public static void main(String[] args){
byte[] bytes = new byte[256];
}
}
[/java]
- BitUtilsクラスのprocessメソッドはアクセス修飾子がpraivateなのでSomeAppクラスからは使用できない
継承と修飾子
[java]
class ClassA{
public int numberOfInstances;
protected ClassA(int numberOfInstances){
this.numberOfInstances = numberOfInstances;
}
}
public class ExtendedA extends ClassA {
private ExtendedA(int numberOfInstances){
super(numberOfInstances);
}
public static void main(String[] args){
ExtendedA ext = new ExtendedA(420);
System.out.println(ext.numberOfInstances);
}
}
[/java]
- サブクラスExtendedAで明示的にスーパークラスClassAの引数1つのコンストラクタを呼び出しているのでエラーにはならない。
- コンストラクタにはpublic,protected,privateなどすべてのアクセス修飾子を指定可能
- private ExtendedAコンストラクタは自クラス内からしか参照できない。ExtendedA extは自クラス内なのでOK
- protected ClassAコンストラクタは同じパッケージかこのクラスを継承したクラスからしか参照できない。super(numberOfInstances)はサブクラスなのでOK。
[java]
public interface A4 {
public void doSomething(String thing);
}
class AImpl implements A4{
public void doSomething(String thing){}
}
class B4{
public A4 doit(){
1 2 3 4 5 |
} public String execute(){ } |
}
class C4 extends B4{
public AImpl doit(){
1 2 3 4 5 |
} public Object execute(){ } |
}
[/java]
- class C4のpublic Object execute()でコンパイルエラーとなる
- クラスBのexecute()メソッドをオーバーライドしようとしているが戻り値がStringではなくObjectになっている
- メッソドのオーバーライドを行う際、戻り値はスーパークラスの同名メソッドと同じかサブクラスでないとならない
[java]
public interface A111{
String s = “yo”;
public void mehod1();
}
interface B{}
interface C extends A111,B{
public void method1();
public void method1(int x);
}
[/java]
- インターフェースは多重継承ができるのでOK(クラスはNG)
- interface C のmethod1()は同じpublic(公開範囲は狭くなっていない)なので問題ない
- interface C のmethod1(int x)は新たに抽象メソッドを定義しているだけ
- String s=”yo”はインターフェース内の変数宣言なのでコンパイル時に暗黙的に定数扱い(public static final)となる
[java]
abstract public class Employee{
protected abstract double getSalesAmount();
public double getCommission(){
return getSalesAmount() * 0.15;
}
}
class Sales extends Employee{
public double getSalesAmount(){return 123.45;}
}
[/java]
- Employee.getSalesAmount()メソッドのアクセス修飾子はprotected
- protectedよりも狭くない公開範囲のprotected,publicであればOK
- private,修飾子なしはNG
[java]
interface Data{public void load();}
abstract class Info{public abstract void load();}
[/java]
[java]
public class Employee extends Info implements Data{
public void load(){/* do something */}
}
[/java]
- extends(クラスの継承)とimplements(インターフェース)ではextends(クラスの継承)を先に記載する
- 抽象クラス.メソッド,インターフェース.メソッドといった書き方はない
コンストラクタ
[java]
public class Hello {
String title;
int value;
public Hello(){
title += ” World”;
}
public Hello(int value){
this.value=value;
title=”Hello”;
Hello();
}
}
class TesterHello{
public static void main(String[] args){
Hello c=new Hello(5);
System.out.println(c.title);
}
}
[/java]
- Hello();でコンパイルエラーとなる
- 引数ありのコンストラクタから自クラスのコンストラクタを通常のメソッドのように呼び出す事はできない
- 上記の中で呼び出す場合はthis();をpublic Hello(int value){のすぐ後で呼び出す必要がある
[java]
public class Planet{
private String name;
public Planet(String name){
this.name = name;
}
public String getName(){
return name;
}
}
[/java]
[java]
public class Tree extends Planet{
public void growFruit(){}
public void drawLeaves(){}
}
[/java]
- Treeクラスにはコンストラクタがないのでコンパイル時に引数のないコンストラクタが生成される
- TreeクラスはPranetクラスのサブクラスなので最初にsuper(引数)がない場合、自動的にスーパークラスのデフォルトコンストラクタが実行される
- Planetクラスには引数ありのコンストラクタがあるので、引数なしのデフォルトコンストラクタが生成されないのでコンパイルエラーとなる
- なので、PlanetクラスにPublic Planet(){this(“fern”)}などを追加すればコンパイルできる
[java]
class Person{
String name = “No name”;
public Person(String nm){
name = nm;
}
}
class Employee extends Person{
String empID = “0000”;
public Employee(String id){
empID = id;
}
}
public class EmployeeTest{
public static void main(String[] args){
Employee e = new Employee(“4321”);
System.out.println(e.empID);
}
}
[/java]
- Employeeクラスのコンストラクタ内でコンパイルエラーとなる
- EmployeeクラスはPersonクラスのサブクラス
- Employeeクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでPersonクラスのデフォルトコンストラクタPerson()が呼び出される
- Personクラスには引数ありのコンストラクタを書いてしまっているのでデフォルトコンストラクタPerson()が生成されない
- Employeeクラスのコンストラクタの最初でsuper(id);のように呼びだせばOK
[java]
class Employee{
String name;
double baseSalary;
Employee(String name,double baseSalary){
this.name = name;
this.baseSalary = baseSalary;
}
}
public class SalesPerson extends Employee{
double commission;
public SalesPerson(String name,double baseSalary,double commission){
//insert code
}
}
[/java]
- SalesPersonクラスのコンストラクタ内でコンパイルエラーとなる
- SalesPersonクラスはEmployeeクラスのサブクラス
- SalesPersonクラスでは明示的なスーパークラスのコンストラクタ呼び出しがないのでEmployeeクラスのデフォルトコンストラクタEmployee()が呼び出される
- Employeeクラスには引数ありのコンストラクタが定義されてしまっているのでデフォルトコンストラクタが生成されない
- SalesPersonクラスのコンストラクタの最初でsuper(name,baseSalary);のように呼び出せばOK
例外
[java]
class A{
public void method1(){
B b = new B();
b.method2();
System.out.println(“class A”);
}
}
class B{
public void method2(){
C c = new C();
c.method3();
System.out.println(“class B”);
}
}
class C{
public void method3(){
String nullStr=null;
System.out.println(nullStr.length());
}
}
public class tryTest {
public static void main(String[] args){
1 2 3 4 5 6 7 8 9 |
try{ A a = new A(); a.method1(); }catch(Exception e){ System.out.println("an error occured"); } } } |
[/java]
- NullPointerExceptionは非チェック例外なのでメソッドにthrowsの指定がなくても必ず呼び出し元に送出される。
- なので、an error occurredが表示される
[java]
public class A2 {
void foo() throws Exception{
throw new Exception();
}
}
class SubB2 extends A2{
void foo(){
System.out.println(“B “);
}
}
class Tester{
public static void main(String[] args){
A2 a = new SubB2();
a.foo();
}
[/java]
- throws句があるのに例外処理がないからコンパイルエラーとなる
- throws句はサブクラスで指定しなくてもオーバーライドされる
[java]
public class A3 {
public void method1(){
try{
B3 b=new B3();
b.method2();
}catch(TestException te){
throw new RuntimeException(te);
}
}
}
class B3{
public void method2() throws TestException{
1 2 |
} |
}
class Tester3{
public void method(){
A3 a = new A3();
a.method1();
}
}
public class TestException extends Exception{
}
[/java]
- 非チェック例外はコンパイル時にチェックされない
- チェック例外はコンパイルエラーになる
- method1()はRuntimeExceptionをthrowしている
- RintimeExceptionは非チェック例外、なので呼び出し元で例外処理がなくてもいい
- TestExceptionはExceptionのサブクラスとして作ったものなので例外処理が必要
キャスト
[java]
public class Base1 {
public static final String FOO = “foo”;
public static void main(String[] args){
Base1 b = new Base1();
Sub1 s = new Sub1();
System.out.print(Base1.FOO);
System.out.print(Sub1.FOO);
System.out.print(b.FOO);
System.out.print(s.FOO);
System.out.print(((Base1)s).FOO);
}
}
class Sub1 extends Base1{
public static final String FOO = “bar”;
}
[/java]
- ((Base1)s).FOOはクラス変数sをキャストしてBASE1型にしているので、BASE1クラスのFOO変数の”foo”が表示される。
[java]
Object[] myObject = {new Integer(12),
new String(“foo”),
new Integer(2),
new Boolean(true)};
Arrays.sort(myObject);
[/java]
- Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringが発生する
- Arrays.sortでArraysにキャストしようとしてExceptionが発生
- Arraysは基本データ型(Integer,BooleanはOK)しか扱えない
- Stringは参照型
[java]
public class TestString1{
public static void main(String[] args){
String str = “420”;
str += 42;
System.out.println(str);
}
}
[/java]
- ストリング変数strに数字42を+=演算子で加えた結果strは42042となる
ループとラベル
[java]
public class Breaker2 {
static String o= “”;
public static void main(String[] args){
1 2 3 4 5 6 7 8 |
z: for(int x=2;x<7;x++){ if(x==3) continue; if(x==5) break z; o=o+x; } System.out.println(o); |
}
}
[/java]
- 出力は24
- continueは処理を1週とばす
- break zはzラベルのついたfor文を終了する
カプセル化
[java]
public class FoobarCard{
private String CardID;
private Integer limit;
public String ownerName;
public void setCardInformation(String cardID,String ownerName,Integer limit){
this.cardID = cardID;
this.limit = limit;
this.ownerName = ownerName;
}
}
[/java]
- 属性と操作を一体化させて表現することをカプセル化と呼ぶ
- 実データであるインスタンス変数が他クラスからむやみに変更される事を防ぐために一般的にインスタンス変数はprivate指定が推奨
- メソッドはpublic指定が推奨
- public指定されているownerName変数がカプセル化を破壊しているといえる
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
「JAWS-UG朝会 #17」に参加しました
朝7:30からのJAWS-UG朝会。 コース実施の日は配信スタジオへの移動時間な …
-
Developers Summit 2024「技術を超えた成長へ:エンジニアとしてのマインドセットと学びの旅」を見ました
NECソリューションイノベータ株式会社 田中 拓摩さん SAP基幹システムのAW …
-
ヤマムギvol.11「AWSではじめるLinux入門ガイド」クイックスタート勉強会を開催しました
2020/7/15に、ヤマムギvol.11としまして、「AWSではじめるLinu …
-
「第3回【関西ITベンチャー】開発ツール チラ見せ♡ナイト@大阪」に行ってきました
「第3回【関西ITベンチャー】開発ツール チラ見せ♡ナイト@大阪」に行ってきまし …
-
JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo 2016 アップデート追っかけ会
「JAWS-UG Osaka 第15回勉強会 AWS Summit Tokyo …
-
AWS認定のバッジ管理が新しくなったみたいです
ふと、メールが届きました。 なんでしょうね。 いきなりリンクを踏むのもあれなんで …
-
Innovation EGG 第6回 『IoT 今と未来』に参加してきました
雨を心配していましたが、曇り空ながら雨はやんで、180名強の方が参加されたInn …
-
AWS Summit 2016 Tokyoに参加してきました (前日 ~ Day1)
AWS Summit 2016 Tokyoにて、セッション聴講、ブース展示拝見、 …
-
JAWS PANKRATION 2021「AWS Control Towerを使用して企業コストのサンドボックスを作成と継続的アウトプットのメリット」発表しました
同時通訳配信 JAWS PANKRATION 2021 -Up till dow …
-
「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってきました
「雲勉 第1回【勉強会:新技術好き!】AWSマネージドサービス勉強会」に行ってき …